// 类装饰器基本概念
/* @test
class A {
  constructor(public prop2: string) {}
}

// 装饰器运行时间：在类定义后直接运行，类装饰器可以具有的返回值：void（仅运行函数），返回一个新的类
function test(target: new (...args: any[]) => object) {
  // 不建议使用这种形式：ts基础会丢失
  // return class B extends target {};
}
 */

// 类装饰器传参
/* @test("这也是一个类")
class A {
  prop1: string;
}

type constructor = new (...args: any[]) => object;
function test(str: string) {
  return function (target: constructor) {};
} */

// 多个装饰器, 从下到上依次运行
@d1()
@d2()
class A {
  prop1: string;
}

type constructor = new (...args: any[]) => object;
function d1() {
  console.log("d1");
  return function (target: constructor) {
    console.log("d1 decorator");
  };
}
function d2() {
  console.log("d2");
  return function (target: constructor) {
    console.log("d2 decorator");
  };
}

export {};
